// Program to find the maximum profit when tradiing in a stock (infinite number of transactions allowed)

// PROBLEM STATEMENT

/*
You are given an integer array prices where prices[i] is the price of a given stock on the ith day.

On each day, you may decide to buy and/or sell the stock. You can only hold at most one share of the stock at any time. However, you can buy it then immediately sell it on the same day.

Find and return the maximum profit you can achieve.

Example 1:

Input: prices = [7,1,5,3,6,4]
Output: 7
Explanation: Buy on day 2 (price = 1) and sell on day 3 (price = 5), profit = 5-1 = 4.
Then buy on day 4 (price = 3) and sell on day 5 (price = 6), profit = 6-3 = 3.
Total profit is 4 + 3 = 7.
Example 2:

Input: prices = [1,2,3,4,5]
Output: 4
Explanation: Buy on day 1 (price = 1) and sell on day 5 (price = 5), profit = 5-1 = 4.
Total profit is 4.
*/



#include<iostream>
#include<vector>

using namespace std;

int maxProfit(vector<int>&prices);

// Driver Code

int main()
{
    int n;
    cin >> n;
    vector<int> prices(n);
    for(int i=0;i<n;i++)
    {
        cin >> prices[i];
    }

    cout << maxProfit(prices) << endl;
}

// Implemented function for the solution.
  int maxProfit(vector<int>& prices) {

      int buy;  // The maximum amount of money I have if I own a stock at day i
      int sell; // The maximum amount of money I have if I dont own a stock at day i

      buy=-prices[0]; // base case: at day 0, starting with $0, I buy a stock at the price of day 0
      sell=0;         // base case: at day 0, starting with $0. Since I dont own any stocks already, I couldnt sell anything to earn profit
      
      for(int i=1;i<prices.size();i++){
      
          // The maximum amount of money I have if I have a stock at day i: max(Bought it yesterday and hold it , sold stock yesterday and buy today)
          buy=max(buy, sell-prices[i]); 
          
          // The maximum amount of money I have if I dont have a stock at day i: max(Sold it yesterday, bought stock yesterday and sell today)
          sell=max(sell, buy+prices[i]); 
      }

      return sell; // max profit if I dont own any stocks at the last day
  }
